/**
 *
 */
package kevin.study.zephyr.domain.dao;

import kevin.study.zephyr.domain.dao.soda.ZQuery;

import java.io.Serializable;
import java.util.List;


/**
 * 泛型DAO
 *
 * @author Kevin.Huang
 * @createtime 2007-9-26
 * @param <K>
 */
public interface IGenericDAO<K> {

    /**
     * 通过ID获取实例
     *
     * @param id ID
     *
     * @return 实例
     */
    K findById(Serializable id);

    /**
     * 返回所有此类型的实例
     *
     * @return 实例
     */
    List<K> findAll();

    /**
     * 根据样例返回实例
     *
     * @param exampleInstance 样例
     *
     * @return 实例
     */
    List<K> findByExample(K exampleInstance);

    /**
     * 根据query返回实例
     *
     * @param query 查询Query
     *
     * @return 实例
     */
    List<K> findByQuery(ZQuery query);

    /**
     * 根据query和page分页查询
     *
     * @param query 查询Query
     * @param index 第几条
     * @param count 多少数
     *
     * @return 实例
     */
    List<K> findByQuery(ZQuery query, int index, int count);

    /**
     * 根据query计算实例总数
     *
     * @param query 查询Query
     *
     * @return 实例数
     */
    Integer findCountByQuery(ZQuery query);

    /**
     * 更新及保存实例
     *
     * @param entity 需要保存的实例
     *
     * @return 保存了的实例
     */
    K saveAndUpdate(K entity);

    /**
     * 删除实例
     *
     * @param entity 需删除的实例
     */
	void delete(K entity);

    /**
	 * 根据id删除实例
	 *
	 * @param id 需删除的实例的id
	 */
	void delete(Serializable id);

}
